package com.ty.consumer;

import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.json.JSONUtil;
import com.rabbitmq.client.Channel;
import com.ty.dto.Luo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;

//@Configuration
@Slf4j
public class FanoutConsumer {

    //定义一个队列 持久化 Q1
    @Bean
    public Queue Q1(){
        return QueueBuilder.durable("Q1").build();
    }

    //定义一个交换机Direct-ex  持久化 Q1
    @Bean
    public Exchange exchange(){
        return ExchangeBuilder.fanoutExchange("Fanout-ex").durable( true).build();
    }

    //队列和交换机的绑定关系
    @Bean
    public Binding binding(){
        return BindingBuilder.bind(Q1()).to(exchange()).with("").noargs();
    }

    //@RabbitListener(queues = "Q1")
    public void consumer1(Luo msg,Message message, Channel channel) throws IOException {
        //使用的AOP动态代理对象，如果目标方法正常执行 basicAck()
        // 如果目标方法异常执行 basicNack()
        System.out.println("广播消费者接收到的消息："+msg);
        long deliveryTag = message.getMessageProperties().getDeliveryTag();

        try {
            ThreadUtil.safeSleep(1000);
            int i = 1/0;
            channel.basicAck(deliveryTag,false ); //Yes

        } catch (Exception e) {
            channel.basicNack(deliveryTag,false,true); // No
            channel.basicReject(deliveryTag,false);
        }

//        int i= 1/0;
    }



    @RabbitListener(queues = "Q1")
    public void consumer2(Luo msg) throws IOException {
        //使用的AOP动态代理对象，如果目标方法正常执行 basicAck()
        // 如果目标方法异常执行 basicNack()
        System.out.println("广播消费者2接收到的消息："+msg);
        log.debug("消费者->{}", JSONUtil.toJsonStr(msg));

          //  ThreadUtil.safeSleep(1000);
            int i = 1/0;

    }


}
